有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java这个代码什么时候崩溃?

这段代码来自我使用的一个库,由于一个错误,我进行了反编译

在Windows 32上,如果启动程序的用户是计算机管理员,则该程序可以正常工作,否则会崩溃。在linux上也会崩溃

/*      */   public static String cambiaEstensione(String nomeFile, String nuovaEstensione)
/*      */   {
/*  140 */     int p = nomeFile.lastIndexOf('.');
/*  141 */     if (p < 0) {
/*  142 */       return nomeFile + "." + nuovaEstensione;
/*      */     }
/*  144 */     return nomeFile.substring(0, p) + "." + nuovaEstensione;
/*      */   }

函数的调用方是:

/* 182 */       if (this.fl_scrivi) {
/* 183 */         stato = "Apertura archivio dichiarazioni da inviare...";
/* 184 */         this.dcm = new Dcm();
/* 185 */         this.dcm.setNomeDcm(Util.cambiaEstensione(args[2], "dcm"));
/* 186 */         this.dcm.setFileDcm(new FileOutputStream(this.dcm.getNomeDcm()));
/*     */       }

例外情况是:

java.io.FileNotFoundException: .dcm (Accesso negato)
    at java.io.FileOutputStream.open(Native Method)
    at java.io.FileOutputStream.<init>(Unknown Source)
    at java.io.FileOutputStream.<init>(Unknown Source)
    at it.finanze.entrate.sco.main.M77S11.elaboraFile(M77S11.java:186)

其中“Accesso negato”表示“拒绝访问

你能帮我理解错误的原因吗


更新:问题的原因是我在args[2]中传递了一个空字符串

在Windows中拥有管理员权限,它没有崩溃,因为它创建了文件{{CD2>},不确定是否必须考虑这个特性或bug。

非常感谢所有回答的人


共 (6) 个答案

  1. # 1 楼答案

    调用this.dcm.getNomeDcm()返回字符串".dcm"(无论出于何种原因),并且不存在具有该名称的文件。这并不奇怪,因为Windows应用程序通常不会仅使用这样的扩展名命名文件

  2. # 2 楼答案

    就在堆栈跟踪中

    java.io.FileNotFoundException: .dcm (Accesso negato)
    

    它找不到名为“.dcm”的文件,所以看起来:

    或者调用函数为文件名传递了一个空字符串,换句话说,args[2]在这一行返回一个空字符串

    this.dcm.setNomeDcm(Util.cambiaEstensione(args[2], "dcm"));
    

    (因为这在Linux上发生)args[2]包含一个类似“.something”的值,所以这一行

    int p = nomeFile.lastIndexOf('.');
    

    返回零,然后是这一行

    return nomeFile.substring(0, p) + "." + nuovaEstensione;
    

    只返回空字符串+“+扩大(即“.dcm”)

    Linux使用“.filename”来表示隐藏的文件

  3. # 3 楼答案

    你应该检查文件是否真的存在,是否有正确的权限

  4. # 4 楼答案

    不懂Java,但看起来您收到了一个拒绝访问的错误(“Java.io.FileNotFoundException:.dcm(Accesso negato)”)

    你确定你有正确的访问权限吗

  5. # 5 楼答案

    我猜“Accesso negato”意味着你没有打开文件的权限。您可以尝试将文件移动到另一个目录,以管理员身份运行程序,或更改所需的权限

    在linux上,您可以使用ls -l <file>检查权限 并使用chmod 666 <file>(所有人的读写权限)更改它们

    另见chmod

  6. # 6 楼答案

    int p = nomeFile.lastIndexOf('.');
    

    如果nomeFile是空字符串,则返回-1,且以下条件为真:

     if (p < 0) {
         return nomeFile + "." + nuovaEstensione;
     }
    

    这将返回一个空字符串、一个点和传入的文件扩展名的浓缩,从而返回“.dmc”。具有此名称的文件似乎不存在